// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library matcher.numeric_matchers_test;

import 'package:matcher/matcher.dart';
import 'package:test/test.dart' show test, group;

import 'test_utils.dart';

void main() {
  test('greaterThan', () {
    shouldPass(10, greaterThan(9));
    shouldFail(9, greaterThan(10), "Expected: a value greater than <10> "
        "Actual: <9> "
        "Which: is not a value greater than <10>");
  });

  test('greaterThanOrEqualTo', () {
    shouldPass(10, greaterThanOrEqualTo(10));
    shouldFail(9, greaterThanOrEqualTo(10),
        "Expected: a value greater than or equal to <10> "
        "Actual: <9> "
        "Which: is not a value greater than or equal to <10>");
  });

  test('lessThan', () {
    shouldFail(10, lessThan(9), "Expected: a value less than <9> "
        "Actual: <10> "
        "Which: is not a value less than <9>");
    shouldPass(9, lessThan(10));
  });

  test('lessThanOrEqualTo', () {
    shouldPass(10, lessThanOrEqualTo(10));
    shouldFail(11, lessThanOrEqualTo(10),
        "Expected: a value less than or equal to <10> "
        "Actual: <11> "
        "Which: is not a value less than or equal to <10>");
  });

  test('isZero', () {
    shouldPass(0, isZero);
    shouldFail(1, isZero, "Expected: a value equal to <0> "
        "Actual: <1> "
        "Which: is not a value equal to <0>");
  });

  test('isNonZero', () {
    shouldFail(0, isNonZero, "Expected: a value not equal to <0> "
        "Actual: <0> "
        "Which: is not a value not equal to <0>");
    shouldPass(1, isNonZero);
  });

  test('isPositive', () {
    shouldFail(-1, isPositive, "Expected: a positive value "
        "Actual: <-1> "
        "Which: is not a positive value");
    shouldFail(0, isPositive, "Expected: a positive value "
        "Actual: <0> "
        "Which: is not a positive value");
    shouldPass(1, isPositive);
  });

  test('isNegative', () {
    shouldPass(-1, isNegative);
    shouldFail(0, isNegative, "Expected: a negative value "
        "Actual: <0> "
        "Which: is not a negative value");
  });

  test('isNonPositive', () {
    shouldPass(-1, isNonPositive);
    shouldPass(0, isNonPositive);
    shouldFail(1, isNonPositive, "Expected: a non-positive value "
        "Actual: <1> "
        "Which: is not a non-positive value");
  });

  test('isNonNegative', () {
    shouldPass(1, isNonNegative);
    shouldPass(0, isNonNegative);
    shouldFail(-1, isNonNegative, "Expected: a non-negative value "
        "Actual: <-1> "
        "Which: is not a non-negative value");
  });

  test('closeTo', () {
    shouldPass(0, closeTo(0, 1));
    shouldPass(-1, closeTo(0, 1));
    shouldPass(1, closeTo(0, 1));
    shouldFail(1.001, closeTo(0, 1),
        "Expected: a numeric value within <1> of <0> "
        "Actual: <1.001> "
        "Which: differs by <1.001>");
    shouldFail(-1.001, closeTo(0, 1),
        "Expected: a numeric value within <1> of <0> "
        "Actual: <-1.001> "
        "Which: differs by <1.001>");
  });

  test('inInclusiveRange', () {
    shouldFail(-1, inInclusiveRange(0, 2),
        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
        "Actual: <-1>");
    shouldPass(0, inInclusiveRange(0, 2));
    shouldPass(1, inInclusiveRange(0, 2));
    shouldPass(2, inInclusiveRange(0, 2));
    shouldFail(3, inInclusiveRange(0, 2),
        "Expected: be in range from 0 (inclusive) to 2 (inclusive) "
        "Actual: <3>");
  });

  test('inExclusiveRange', () {
    shouldFail(0, inExclusiveRange(0, 2),
        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
        "Actual: <0>");
    shouldPass(1, inExclusiveRange(0, 2));
    shouldFail(2, inExclusiveRange(0, 2),
        "Expected: be in range from 0 (exclusive) to 2 (exclusive) "
        "Actual: <2>");
  });

  test('inOpenClosedRange', () {
    shouldFail(0, inOpenClosedRange(0, 2),
        "Expected: be in range from 0 (exclusive) to 2 (inclusive) "
        "Actual: <0>");
    shouldPass(1, inOpenClosedRange(0, 2));
    shouldPass(2, inOpenClosedRange(0, 2));
  });

  test('inClosedOpenRange', () {
    shouldPass(0, inClosedOpenRange(0, 2));
    shouldPass(1, inClosedOpenRange(0, 2));
    shouldFail(2, inClosedOpenRange(0, 2),
        "Expected: be in range from 0 (inclusive) to 2 (exclusive) "
        "Actual: <2>");
  });
}
